package com.atguigu.gulimall.search.thread;

/**
 * 启动了3个线程，每个线程都给线程本地变量加5，但是线程本地变量不会累加到15，它会给这3个线程都依次加5
 *
 * 经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。
 * 这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作，
 * 不会出现 A 线程关了 B线程正在使用的 Connection
 */
public class ThreadLocalTest {

    //线程本地变量
    private static final ThreadLocal<Integer> THREAD_LOCAL_NUM = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            //启动三个线程
            Thread t = new Thread() {
                @Override
                public void run() {
                    addByThreadLocal();
                }
            };
            t.start();
        }
    }

    //线程本地变量加5
    private static void addByThreadLocal() {
        for (int i = 0; i < 5; i++) {
            Integer n = THREAD_LOCAL_NUM.get();
            n += 1;
            THREAD_LOCAL_NUM.set(n);
            System.out.println(Thread.currentThread().getName() + " : ThreadLocal num = " + n);
        }
    }
}
